/*
 *            Dini 1.4
 *       (c) Copyright 2006 by DracoBlue
 *
 * @author    : DracoBlue (http://dracoblue.com)
 * @date      : 13th May 2006
 * @update    : 3rd Oct 2006
 * @require   : DUtils 1.5.1
 *
 * This file is provided as is (no warranties).
 *
 * Feel free to use it, a little message in
 * about box is honouring thing, isn't it?
 *
 */

//#define MAX_STRING 256

#if defined _dini_included
  #endinput
#endif

#define _dini_included
#pragma library dutils

//#include <dutils>

dini_Exists(filename[]) {
  if (fexist(filename)) return true;
  return false;
}

dini_Remove(filename[]) {
  if (!fexist(filename)) return false;
  fremove(filename);
  return true;
}

dini_Create(filename[]) {
  new File:fhnd;
  if (fexist(filename)) return false;
  fhnd=fopen(filename,io_write);
  fclose(fhnd);
  return true;
}

dini_PRIVATE_ExtractKey(line[]) {
    new tmp[MAX_STRING];
    tmp[0]=0;
    if (strfind(line,"=",true)==-1) return tmp;
    set(tmp,strlower(ret_memcpy(line,0,strfind(line,"=",true))));
    return tmp;
}

dini_PRIVATE_ExtractValue(line[]) {
    new tmp[MAX_STRING];
    tmp[0]=0;
    if (strfind(line,"=",true)==-1) {
        return tmp;
    }
    set(tmp,ret_memcpy(line,strfind(line,"=",true)+1,strlen(line)));
    return tmp;
}

dini_Set(filename[],key[],value[]) {
  new File:fohnd, File:fwhnd;
  new bool:wasset=false;
  new tmpres[MAX_STRING];
  if (key[0]==0) return false; /* If we have no sign in key, it can't be set*/
  format(tmpres,sizeof(tmpres),"%s.part",filename);
  fohnd=fopen(filename,io_read);
  if (!fohnd) return false;
  fremove(tmpres);
  fwhnd=fopen(tmpres,io_write);
//  if (!fwhnd) return false;
  while (fread(fohnd,tmpres)) {
    StripNewLine(tmpres);
    if ((!wasset)&&(equal(dini_PRIVATE_ExtractKey(tmpres),key,true))) {
      /* We've got what needs to be replaced! */
      format(tmpres,sizeof(tmpres),"%s=%s",key,value);
      wasset=true;
    }
    fwrite(fwhnd,tmpres);
    fwrite(fwhnd,"\r\n");
  }

  if (!wasset) {
    format(tmpres,sizeof(tmpres),"%s=%s",key,value);
    fwrite(fwhnd,tmpres);
    fwrite(fwhnd,"\r\n");
  }

  fclose(fohnd);
  fclose(fwhnd);

  format(tmpres,sizeof(tmpres),"%s.part",filename);
  if (fcopytextfile(tmpres,filename)) {
    return fremove(tmpres);
  }
  return false;
}


dini_IntSet(filename[],key[],value) {
   new valuestring[MAX_STRING];
   format(valuestring,sizeof(valuestring),"%d",value);
   return dini_Set(filename,key,valuestring);
}

dini_Int(filename[],key[]) {
   return strval(dini_Get(filename,key));
}

dini_FloatSet(filename[],key[],Float:value) {
   new valuestring[MAX_STRING];
   format(valuestring,sizeof(valuestring),"%f",value);
   return dini_Set(filename,key,valuestring);
}

/*
Float:dini_Float(filename[],key[]) {
   return floatstr(dini_Get(filename,key));
}
*/
dini_Bool(filename[],key[]) {
   return strval(dini_Get(filename,key));
}

dini_BoolSet(filename[],key[],value) {
   new valuestring[MAX_STRING];
   format(valuestring,sizeof(valuestring),"%d",value);
   return dini_Set(filename,key,valuestring);
}

dini_Unset(filename[],key[]) {
  new File:fohnd, File:fwhnd;
  new tmpres[MAX_STRING];
  format(tmpres,sizeof(tmpres),"%s.part",filename);
  fohnd=fopen(filename,io_read);
  if (!fohnd) return false;
  fremove(tmpres);
  fwhnd=fopen(tmpres,io_write);
//  if (!fwhnd) return false;
  while (fread(fohnd,tmpres)) {
    StripNewLine(tmpres);
    if (equal(dini_PRIVATE_ExtractKey(tmpres),key,true)) {
      /* We've got what needs to be removed! */
    } else {
    format(tmpres,sizeof(tmpres),"%s",tmpres);
    fwrite(fwhnd,tmpres);
    fwrite(fwhnd,"\r\n");
    }
  }

  fclose(fohnd);
  fclose(fwhnd);

  format(tmpres,sizeof(tmpres),"%s.part",filename);
  if (fcopytextfile(tmpres,filename)) {
    return fremove(tmpres);
  }
  return false;
}



dini_Get(filename[],key[]) {
  new File:fohnd;
  new tmpres[MAX_STRING];
  new tmpres2[MAX_STRING];
  tmpres[0]=0;
  fohnd=fopen(filename,io_read);
  if (!fohnd) return tmpres;
  while (fread(fohnd,tmpres)) {
    StripNewLine(tmpres);
    if (equal(dini_PRIVATE_ExtractKey(tmpres),key,true)) {
      /* We've got what we need */
      tmpres2[0]=0;
      strcat(tmpres2,dini_PRIVATE_ExtractValue(tmpres));
      fclose(fohnd);
      return tmpres2;
    }
  }
  fclose(fohnd);
  return tmpres;
}


dini_Isset(filename[],key[]) {
  new File:fohnd;
  new tmpres[MAX_STRING];
  fohnd=fopen(filename,io_read);
  if (!fohnd) return false;
  while (fread(fohnd,tmpres)) {
    StripNewLine(tmpres);
    if (equal(dini_PRIVATE_ExtractKey(tmpres),key,true)) {
      /* We've got what we need */
      fclose(fohnd);
      return true;
    }
  }
  fclose(fohnd);
  return false;
}
